import dayjs from "dayjs";
import { message } from "@/utils/message";
import { ElMessageBox, Sort } from "element-plus";
import { reactive, ref, onMounted, toRaw, computed } from "vue";
import { useUserStoreHook } from "@/store/modules/user";
import { CommonUtils } from "@/utils/common";
import { PaginationProps } from "@pureadmin/table";
import {
  SubmissionListCommand,
  SubmissionPageResponse,
  getSubmissionListApi,
  exportSubmissionExcelApi,
  deleteSubmissionApi,
  batchSubmitSubmissionApi
} from "@/api/performance/submission";

const submissionStatusMap = {
  DRAFT: { label: "待提交", cssTag: "info" },
  PENDING_AUDIT: { label: "审核中", cssTag: "warning" },
  REJECTED: { label: "已驳回", cssTag: "danger" },
  APPROVED: { label: "已批准", cssTag: "success" }
};

// 定义分类数据结构
const categoryData = [
  {
    value: "科研工作量",
    label: "科研工作量",
    children: [
      {
        value: "论文和学术报告",
        label: "论文和学术报告",
        children: [
          { value: "1区 SCI 论文（1 篇记 1000 分）", label: "1区 SCI 论文（1 篇记 1000 分）" },
          { value: "2区 SCI 论文（1 篇记 700 分）", label: "2区 SCI 论文（1 篇记 700 分）" },
          { value: "3区 SCI 论文（1 篇记 400 分）", label: "3区 SCI 论文（1 篇记 400 分）" },
          { value: "4区 SCI 论文或 EI 期刊论文（1 篇记 300 分）", label: "4区 SCI 论文或 EI 期刊论文（1 篇记 300 分）" },
          { value: "北大核心论文（1 篇记 200 分）", label: "北大核心论文（1 篇记 200 分）" },
          { value: "普刊、教改论文和会议论文（1 篇记 100 分）", label: "普刊、教改论文和会议论文（1 篇记 100 分）" },
          { value: "参加省部级以上学术会议并做报告（1 次记 60 分）", label: "参加省部级以上学术会议并做报告（1 次记 60 分）" },
          { value: "参加校级学术会议并做报告（1 次记 30 分）", label: "参加校级学术会议并做报告（1 次记 30 分）" }
        ]
      },
      {
        value: "科研项目",
        label: "科研项目",
        children: [
          { value: "国家自然科学基金面上项目（1 项记 6000 分）", label: "国家自然科学基金面上项目（1 项记 6000 分）" },
          { value: "国家自然科学基金青年项目（1 项记 3000 分）", label: "国家自然科学基金青年项目（1 项记 3000 分）" },
          { value: "国家自然科学基金重点项目的子课题（1 项记 2000 分）", label: "国家自然科学基金重点项目的子课题（1 项记 2000 分）" },
          { value: "省部级重点基金项目（1 项记 2000 分）", label: "省部级重点基金项目（1 项记 2000 分）" },
          { value: "省部级基金项目（1 项记 1000 分）", label: "省部级基金项目（1 项记 1000 分）" },
          { value: "厅局级项目（1 项记 500 分）", label: "厅局级项目（1 项记 500 分）" },
          { value: "校级重点项目（1 项记 300 分）", label: "校级重点项目（1 项记 300 分）" },
          { value: "校级面上项目（1 项记 200 分）", label: "校级面上项目（1 项记 200 分）" },
          { value: "校级青年项目（1 项记 100 分）", label: "校级青年项目（1 项记 100 分）" },
          { value: "横向项目到账经费（每1万记 10 分）", label: "横向项目到账经费（每1万记 10 分）" }
        ]
      }
    ]
  },
  {
    value: "教研工作量",
    label: "教研工作量",
    children: [
      {
        value: "教研项目",
        label: "教研项目",
        children: [
          { value: "国家级教研项目（1 项记 3000 分）", label: "国家级教研项目（1 项记 3000 分）" },
          { value: "省部级教研项目（1 项记 1500 分）", label: "省部级教研项目（1 项记 1500 分）" },
          { value: "校级教研项目（1 项记 200 分）", label: "校级教研项目（1 项记 200 分）" }
        ]
      },
      {
        value: "其他科研教研成果",
        label: "其他科研教研成果",
        children: [
          { value: "国家级一等奖（1 项记 3000 分）", label: "国家级一等奖（1 项记 3000 分）" },
          { value: "国家级二等奖（1 项记 1500 分）", label: "国家级二等奖（1 项记 1500 分）" },
          { value: "国家级三等奖（1 项记 1000 分）", label: "国家级三等奖（1 项记 1000 分）" },
          { value: "省部级一等奖（1 项记 800 分）", label: "省部级一等奖（1 项记 800 分）" },
          { value: "省部级二等奖（1 项记 600 分）", label: "省部级二等奖（1 项记 600 分）" },
          { value: "省部级三等奖（1 项记 400 分）", label: "省部级三等奖（1 项记 400 分）" },
          { value: "校级获奖（1 项记 100 分）", label: "校级获奖（1 项记 100 分）" },
          { value: "发明专利（1 项记 800 分）", label: "发明专利（1 项记 800 分）" },
          { value: "实用新型专利（1 项记 100 分）", label: "实用新型专利（1 项记 100 分）" },
          { value: "软件著作权（1 项记 100 分）", label: "软件著作权（1 项记 100 分）" },
          { value: "国家级或省部级学术著作（1 部记 3000 分）", label: "国家级或省部级学术著作（1 部记 3000 分）" },
          { value: "校级学术著作（1 部记 1500 分）", label: "校级学术著作（1 部记 1500 分）" }
        ]
      },
      {
        value: "学术兼职",
        label: "学术兼职",
        children: [
          { value: "国家自然基金委评审专家（评审年度记 200 分）", label: "国家自然基金委评审专家（评审年度记 200 分）" },
          { value: "SCI、EI、核心期刊主编、副主编、编委（每年记 100 分）", label: "SCI、EI、核心期刊主编、副主编、编委（每年记 100 分）" },
          { value: "国家级、省部级学术协会委员（每年记 100 分）", label: "国家级、省部级学术协会委员（每年记 100 分）" }
        ]
      }
    ]
  },
  {
    value: "育人工作量",
    label: "育人工作量",
    children: [
      {
        value: "学科竞赛",
        label: "学科竞赛",
        children: [
          { value: "指导学生获国家级一等奖（1 项记 1000 分）", label: "指导学生获国家级一等奖（1 项记 1000 分）" },
          { value: "指导学生获国家级二等奖（1 项记 800 分）", label: "指导学生获国家级二等奖（1 项记 800 分）" },
          { value: "指导学生获国家级三等奖（1 项记 600 分）", label: "指导学生获国家级三等奖（1 项记 600 分）" },
          { value: "指导学生获省部级一等奖（1 项记 400 分）", label: "指导学生获省部级一等奖（1 项记 400 分）" },
          { value: "指导学生获省部级二等奖（1 项记 200 分）", label: "指导学生获省部级二等奖（1 项记 200 分）" },
          { value: "指导学生获省部级三等奖（1 项记 100 分）", label: "指导学生获省部级三等奖（1 项记 100 分）" }
        ]
      },
      {
        value: "学科竞赛组织与培训",
        label: "学科竞赛组织与培训",
        children: [
          { value: "参与学科竞赛的组织、培训和指导，工作量达 16 学时以上记 1 分", label: "参与学科竞赛的组织、培训和指导，工作量达 16 学时以上记 1 分" }
        ]
      },
      {
        value: "科研论文",
        label: "科研论文",
        children: [
          { value: "指导学生发表科研论文（学生第一作者记 200 分，学生参与记 100 分）", label: "指导学生发表科研论文（学生第一作者记 200 分，学生参与记 100 分）" }
        ]
      },
      {
        value: "科研项目",
        label: "科研项目",
        children: [
          { value: "指导理学院学生参与科研项目记 50 分，每年累计不超过 100 分", label: "指导理学院学生参与科研项目记 50 分，每年累计不超过 100 分" }
        ]
      },
      {
        value: "科研项目申报",
        label: "科研项目申报",
        children: [
          { value: "指导理学院学生成功完成申报省部级及以上的科研项目 1 项记 100 分", label: "指导理学院学生成功完成申报省部级及以上的科研项目 1 项记 100 分" }
        ]
      },
      {
        value: "专利与学术著作",
        label: "专利与学术著作",
        children: [
          { value: "指导理学院的学生参与专利、获奖等申报工作，参与编写学术著作 (专著、教材、译著等)1 项记 100 分，每年累计不超过 200 分", label: "指导理学院的学生参与专利、获奖等申报工作，参与编写学术著作 (专著、教材、译著等)1 项记 100 分，每年累计不超过 200 分" }
        ]
      },
      {
        value: "毕业论文指导",
        label: "毕业论文指导",
        children: [
          { value: "指导理学院毕业生 1 名，完成毕业论文记 50 分，每年累计不超过 400 分", label: "指导理学院毕业生 1 名，完成毕业论文记 50 分，每年累计不超过 400 分" }
        ]
      },
      {
        value: "硕士研究生指导",
        label: "硕士研究生指导",
        children: [
          { value: "指导理学院硕士研究生 1 名，完成相关开题工作记 50 分，完成毕业论文记 100 分，每年累计不超过 500 分", label: "指导理学院硕士研究生 1 名，完成相关开题工作记 50 分，完成毕业论文记 100 分，每年累计不超过 500 分" }
        ]
      },
      {
        value: "学术会议指导",
        label: "学术会议指导",
        children: [
          { value: "指导理学院学生参加国内外重要学术会议并作报告 1 次记 100 分，每年累计不超过 200 分", label: "指导理学院学生参加国内外重要学术会议并作报告 1 次记 100 分，每年累计不超过 200 分" }
        ]
      },
      {
        value: "新教师指导",
        label: "新教师指导",
        children: [
          { value: "指导新教师 1 名，并且完成相关指导工作记 100 分", label: "指导新教师 1 名，并且完成相关指导工作记 100 分" },
          { value: "指导新教师参加省级竞赛并获成功参赛奖 1 项记 100 分", label: "指导新教师参加省级竞赛并获成功参赛奖 1 项记 100 分" },
          { value: "指导新教师获省级奖励 1 项记 200 分", label: "指导新教师获省级奖励 1 项记 200 分" },
          { value: "指导新教师获国家级奖励 1 项记 300 分", label: "指导新教师获国家级奖励 1 项记 300 分" }
        ]
      }
    ]
  },
  {
    value: "服务工作量",
    label: "服务工作量",
    children: [
      {
        value: "硕士点建设",
        label: "硕士点建设",
        children: [
          { value: "深度参与数学、应用统计、大数据技术与工程硕士点建设，记 100 分，每年累计不超过 300 分", label: "深度参与数学、应用统计、大数据技术与工程硕士点建设，记 100 分，每年累计不超过 300 分" }
        ]
      },
      {
        value: "专业建设",
        label: "专业建设",
        children: [
          { value: "深度参与信息与计算科学、数据科学与大数据专业建设，记 100 分", label: "深度参与信息与计算科学、数据科学与大数据专业建设，记 100 分" },
          { value: "每年修订人才培养方案，记 200 分，每年累计不超过 300 分", label: "每年修订人才培养方案，记 200 分，每年累计不超过 300 分" }
        ]
      },
      {
        value: "学术会议",
        label: "学术会议",
        children: [
          { value: "举办国家级学术或教研会议，记 200 分", label: "举办国家级学术或教研会议，记 200 分" },
          { value: "举办省级学术或教研会议，记 100 分", label: "举办省级学术或教研会议，记 100 分" },
          { value: "邀请知名专家到校开展学术报告，记 50 分", label: "邀请知名专家到校开展学术报告，记 50 分" }
        ]
      },
      {
        value: "实验基地建设",
        label: "实验基地建设",
        children: [
          { value: "深度参与实验实训基地建设，并取得阶段性成果，每年累计不超过 2 分", label: "深度参与实验实训基地建设，并取得阶段性成果，每年累计不超过 2 分" }
        ]
      },
      {
        value: "实验室管理",
        label: "实验室管理",
        children: [
          { value: "参与国家级实验室或平台管理，并取得阶段性成果，每年累计不超过 200 分", label: "参与国家级实验室或平台管理，并取得阶段性成果，每年累计不超过 200 分" },
          { value: "参与省级实验室或平台管理，并取得阶段性成果，每年累计不超过 150 分", label: "参与省级实验室或平台管理，并取得阶段性成果，每年累计不超过 150 分" },
          { value: "参与校级实验室或平台管理，并取得阶段性成果，每年累计不超过 100 分", label: "参与校级实验室或平台管理，并取得阶段性成果，每年累计不超过 100 分" }
        ]
      },
      {
        value: "设备管理",
        label: "设备管理",
        children: [
          { value: "实验室的设备管理工作，管理 1 间实验室，且管理实验器材件数大于等于 40 件或实验器材资产大于等于 100 万元，记 100 分", label: "实验室的设备管理工作，管理 1 间实验室，且管理实验器材件数大于等于 40 件或实验器材资产大于等于 100 万元，记 100 分" },
          { value: "固定资产超过 2000 万的实验室按国家级实验室处理，固定资产在 1000 万至 2000 万的实验室按省级实验室处理，教学实验室按校级实验室处理，不重复记录", label: "固定资产超过 2000 万的实验室按国家级实验室处理，固定资产在 1000 万至 2000 万的实验室按省级实验室处理，教学实验室按校级实验室处理，不重复记录" }
        ]
      },
      {
        value: "课程建设",
        label: "课程建设",
        children: [
          { value: "负责国家级一流课程建设，记 500 分", label: "负责国家级一流课程建设，记 500 分" },
          { value: "参与建设 1 门理学院的国家级一流课程，记 200 分", label: "参与建设 1 门理学院的国家级一流课程，记 200 分" },
          { value: "负责省级一流课程建设，记 300 分", label: "负责省级一流课程建设，记 300 分" },
          { value: "参与建设 1 门理学院的省级一流课程，记 150 分", label: "参与建设 1 门理学院的省级一流课程，记 150 分" },
          { value: "负责校级一流课程建设，记 200 分", label: "负责校级一流课程建设，记 200 分" },
          { value: "参与建设 1 门理学院的校级一流课程，记 80 分", label: "参与建设 1 门理学院的校级一流课程，记 80 分" },
          { value: "负责 1 门课程的课程建设，记 100 分", label: "负责 1 门课程的课程建设，记 100 分" },
          { value: "参与建设 1 门理学院课程的建设，记 50 分", label: "参与建设 1 门理学院课程的建设，记 50 分" }
        ]
      },
      {
        value: "党政管理工作",
        label: "党政管理工作",
        children: [
          { value: "院长（记 500 分）", label: "院长（记 500 分）" },
          { value: "副院长（记 400 分）", label: "副院长（记 400 分）" },
          { value: "办公室主任（记 300 分）", label: "办公室主任（记 300 分）" },
          { value: "办公室人员（记 250 分）", label: "办公室人员（记 250 分）" },
          { value: "系、教研室主任（记 200 分）", label: "系、教研室主任（记 200 分）" },
          { value: "副主任（记 150 分）", label: "副主任（记 150 分）" },
          { value: "党支部书记（记 100 分）", label: "党支部书记（记 100 分）" },
          { value: "支部委员（记 50 分）", label: "支部委员（记 50 分）" },
          { value: "纪委委员（记 50 分）", label: "纪委委员（记 50 分）" },
          { value: "督导组成员（记 100 分）", label: "督导组成员（记 100 分）" },
          { value: "班导师（记 100 分）", label: "班导师（记 100 分）" },
          { value: "工会委员（记 50 分）", label: "工会委员（记 50 分）" },
          { value: "工会小组成员（记 50 分）", label: "工会小组成员（记 50 分）" }
        ]
      },
      {
        value: "社会服务",
        label: "社会服务",
        children: [
          { value: "提供有社会影响力的社会服务工作，记 100 分，每年累计不超过 100 分", label: "提供有社会影响力的社会服务工作，记 100 分，每年累计不超过 100 分" }
        ]
      },
      {
        value: "学院创收",
        label: "学院创收",
        children: [
          { value: "为理学院创收（每 2 万元计 100 分）", label: "为理学院创收（每 2 万元计 100 分）" }
        ]
      },
      {
        value: "服务事项",
        label: "服务事项",
        children: [
          { value: "服务理学院的相关重大事项，原则上不超过 100 分", label: "服务理学院的相关重大事项，原则上不超过 100 分" }
        ]
      }
    ]
  },
  {
    value: "其他工作量",
    label: "其他工作量",
    children: [
      {
        value: "其他",
        label: "其他",
        children: [
          { value: "其他", label: "其他" }
        ]
      }
    ]
  }
];
// 定义审核级别映射
const auditLevelMap = {
  0: "非审核状态",
  1: "待一审",
  2: "待二审",
  3: "待三审",
  4: "已完成"
};


// 正式开始js代码，也就是页面初始化时会执行的代码
export function useSubmissionHook() {
  // 设置默认的排序规则descending和ascending两种
  const defaultSort: Sort = {
    prop: "createTime",
    order: "descending"
  };
  // 分页设置
  const pagination: PaginationProps = {
    total: 0,
    pageSize: 10,
    currentPage: 1,
    background: true
  };

  // 注意：这个函数是一个计算属性，也就是说当用户设置时间选择框的属性时，这个函数会自动执行，并且会将时间选择框的属性赋值给searchFormParams的beginTime和endTime
  const timeRange = computed<[string, string] | null>({
    get() {
      if (searchFormParams.beginTime && searchFormParams.endTime) {
        return [searchFormParams.beginTime, searchFormParams.endTime];
      } else {
        return null;
      }
    },
    set(v) {
      if (v?.length === 2) {
        searchFormParams.beginTime = v[0];
        searchFormParams.endTime = v[1];
      } else {
        searchFormParams.beginTime = undefined;
        searchFormParams.endTime = undefined;
      }
    }
  });
  // 创建一个响应式的对象，用于存储查询参数
  //   reactive 使得普通的 JavaScript 对象变得响应式，Vue 会追踪这个对象的所有属性，当你修改对象的属性时，Vue 会自动更新使用这个属性的地方，确保 UI 和数据同步
  // 它只对对象的属性进行响应式处理，而不能用于原始类型（如 string、number 等）或者数组。
  const searchFormParams = reactive<SubmissionListCommand>({
    title: "",
    status: undefined,
    assessmentYear: undefined,
    mainCategory: undefined,
    subCategory: undefined,
    itemCategory: undefined,
    currentAuditLevel: undefined,
    owner: undefined
  });

  // 分类联动相关变量
  const mainCategoryOptions = computed(() => {
    return categoryData.map(item => ({
      value: item.value,
      label: item.label
    }));
  });

  const subCategoryOptions = computed(() => {
    if (searchFormParams.mainCategory) {
      const mainCategory = categoryData.find(item => item.value === searchFormParams.mainCategory);
      if (mainCategory && mainCategory.children) {
        return mainCategory.children.map(item => ({
          value: item.value,
          label: item.label
        }));
      }
    }
    return [];
  });

  const itemCategoryOptions = computed(() => {
    if (searchFormParams.mainCategory && searchFormParams.subCategory) {
      const mainCategory = categoryData.find(item => item.value === searchFormParams.mainCategory);
      if (mainCategory && mainCategory.children) {
        const subCategory = mainCategory.children.find(item => item.value === searchFormParams.subCategory);
        if (subCategory && subCategory.children) {
          return subCategory.children.map(item => ({
            value: item.value,
            label: item.label
          }));
        }
      }
    }
    return [];
  });

  // 表格数据
  const dataList = ref([]);
  // 标志：保存表格是否正在加载数据
  const pageLoading = ref(true);
  // 标志：保存表格是否有选中数据（用于存储用户在表格中选中的多条记录）
  const multipleSelection = ref([]);
  // 标志：保存表格的排序规则，在上面被初始化了
  const sortState = ref<Sort>(defaultSort);
  
  // 判断是否为子项目（项目负责人不等于得分人）
  function isSubProject(row: SubmissionPageResponse): boolean {
    return row.owner && row.creatorId && row.owner !== row.creatorId;
  }
  
  // 表格列配置
  const columns: TableColumnList = [
    {
      type: "selection",
      align: "left",
      selectable: (row: SubmissionPageResponse) => !isSubProject(row)

    },
    {
      label: "序号",
      prop: "id",
      minWidth: 60
    },
    {
      label: "考核年度",
      prop: "assessmentYear",
      minWidth: 80
    },
    {
      label: "主类别",
      prop: "mainCategory",
      minWidth: 140
    },
    {
      label: "子类别",
      prop: "subCategory",
      minWidth: 160
    },
    {
      label: "项目类别",
      prop: "itemCategory",
      minWidth: 200
    },
    {
      label: "标题",
      prop: "title",
      minWidth: 200,
      slot: "title" // 添加 slot
    },
    {
      label: "项目总分",
      prop: "userReportedScore",
      minWidth: 60
    },
    {
      label: "项目负责人",
      prop: "creatorName",
      minWidth: 100
    },
    {
      label: "分配分数",
      prop: "ownerScore",
      minWidth: 60
    },
    {
      label: "得分人",
      prop: "ownerName",
      minWidth: 100
    },
    {
      label: "当前状态",
      prop: "status",
      minWidth: 100,
      cellRenderer: ({ row, props }) => (
        <el-tag
          size={props.size}
          type={submissionStatusMap[row.status]?.cssTag || "info"}
          effect="plain"
        >
          {submissionStatusMap[row.status]?.label || row.status}
        </el-tag>
      )
    },
    {
      label: "当前审核级别",
      prop: "currentAuditLevel",
      minWidth: 100,
      formatter: ({ currentAuditLevel }) => {
        return auditLevelMap[currentAuditLevel] || currentAuditLevel;
      }
    },
    {
      label: "总一级审核",
      prop: "firstReviewerName",
      minWidth: 100
    },
    {
      label: "总二级审核",
      prop: "secondReviewerName",
      minWidth: 100
    },
    {
      label: "总三级审核",
      prop: "thirdReviewerName",
      minWidth: 100
    },
    {
      label: "创建时间",
      minWidth: 160,
      prop: "createTime",
      sortable: "custom",
      formatter: ({ createTime }) =>
        dayjs(createTime).format("YYYY-MM-DD HH:mm:ss")
    },
    {
      label: "完成审核时间",
      minWidth: 160,
      prop: "thirdReviewTime",
      sortable: "custom",
      formatter: ({ thirdReviewTime }) =>
        thirdReviewTime ? dayjs(thirdReviewTime).format("YYYY-MM-DD HH:mm:ss") : "无"
    },
    {
      label: "操作",
      fixed: "right",
      width: 240,
      slot: "operation"
    }
  ];
  // 表格列的排序变化的时候，会触发这个函数
  function onSortChanged(sort: Sort) {
    sortState.value = sort;
    // 表格列的排序变化的时候，需要重置分页
    pagination.currentPage = 1;
    // 表格列的排序变化的时候，需要重新查询数据
    getSubmissionList();
  }
  // 表格的搜索按钮点击的时候，会触发这个函数
  async function onSearch(tableRef?: any) {
    // 如果传入了tableRef参数，则执行排序操作
    if (tableRef && tableRef.getTableRef) {
      tableRef.getTableRef().sort("createTime", "descending");
    } else {
      // 没有传入tableRef参数时直接获取数据列表
      getSubmissionList();
    }
  }
  //  重置表单
  function resetForm(formEl, tableRef) {
    if (!formEl) return;
    // 清空查询参数
    formEl.resetFields();
    // 清空时间查询  TODO  这块有点繁琐  有可以优化的地方吗？
    // Form组件的resetFields方法无法清除datepicker里面的数据。
    searchFormParams.beginTime = undefined;
    searchFormParams.endTime = undefined;
    // 重置分页并查询
    onSearch(tableRef);
  }
  //  获取绩效上报列表（查询数据）
  async function getSubmissionList() {
    pageLoading.value = true;
    // 在查询之前，需要将查询参数赋值给searchFormParams，包括分页参数
    CommonUtils.fillSortParams(searchFormParams, sortState.value);
    CommonUtils.fillPaginationParams(searchFormParams, pagination);
    // 将响应式对象通过toraw函数转化为普通对象，函数通常需要接收一个普通的 JavaScript 对象（而非代理对象）作为请求参数。响应式对象的代理可能会引起一些不必要的副作用或导致 API 接口的异常行为
    const { data } = await getSubmissionListApi(
      toRaw(searchFormParams)
    ).finally(() => {
      pageLoading.value = false;
    });
    dataList.value = data.rows;
    pagination.total = data.total;
  }

  async function exportAllExcel() {
    if (sortState.value != null) {
      CommonUtils.fillSortParams(searchFormParams, sortState.value);
    }
    CommonUtils.fillPaginationParams(searchFormParams, pagination);
    CommonUtils.fillTimeRangeParams(searchFormParams, timeRange.value);

    exportSubmissionExcelApi(toRaw(searchFormParams), "绩效上报数据.xlsx");
  }

  async function handleDelete(row) {
    await deleteSubmissionApi([row.id]).then(() => {
      message(`您删除了编号为${row.id}的这条绩效上报数据`, {
        type: "success"
      });
      // 刷新列表
      getSubmissionList();
    });
  }

  async function handleBulkDelete(tableRef) {
    if (multipleSelection.value.length === 0) {
      message("请选择需要删除的数据", { type: "warning" });
      return;
    }

    ElMessageBox.confirm(
      `确认要<strong>删除</strong>编号为<strong style='color:var(--el-color-primary)'>[ ${multipleSelection.value} ]</strong>的绩效上报数据吗?（无法撤回）`,
      "系统提示",
      {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
        dangerouslyUseHTMLString: true,
        draggable: true
      }
    )
      .then(async () => {
        await deleteSubmissionApi(multipleSelection.value).then(() => {
          message(
            `您删除了编号为[ ${multipleSelection.value} ]的绩效上报数据`,
            {
              type: "success"
            }
          );
          // 刷新列表
          getSubmissionList();
        });
      })
      .catch(() => {
        message("取消删除", {
          type: "info"
        });
        // 清空checkbox选择的数据
        tableRef.getTableRef().clearSelection();
      });
  }

  async function handleSubmit(row, tableRef?) {
    const allowedStatuses = ["DRAFT", "REJECTED"];
    if (!allowedStatuses.includes(row.status)) {
      message('仅"待提交"或"已驳回"状态的数据可以提交', {
        type: "warning"
      });
      return;
    }

    ElMessageBox.confirm(
      `是否确认提交标题为<strong style='color:var(--el-color-primary)'>${row.title}</strong>的绩效上报项目材料?（无法撤回）`,
      "系统提示",
      {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
        dangerouslyUseHTMLString: true,
        draggable: true
      }
    )
      .then(async () => {
        await batchSubmitSubmissionApi([row.id]).then(() => {
          message(`您已成功提交标题为 ${row.title} 的绩效上报项目`, {
            type: "success"
          });
          getSubmissionList();
          tableRef?.getTableRef?.().clearSelection?.();
        });
      })
      .catch(() => {
        message("取消提交", {
          type: "info"
        });
      });
  }

  async function handleBulkSubmit(tableRef) {
    if (multipleSelection.value.length === 0) {
      message("请选择需要提交的数据", { type: "warning" });
      return;
    }

    // 根据选中的ID获取对应的数据
    const selectedItems = dataList.value.filter(item =>
      multipleSelection.value.includes(item.id)
    );

    // 检查是否有无法批量提交的状态（仅允许待提交或已驳回）
    const allowedStatuses = ["DRAFT", "REJECTED"];
    const invalidItems = selectedItems.filter(
      item => !allowedStatuses.includes(item.status)
    );
    if (invalidItems.length > 0) {
      const invalidTitles = invalidItems.map(item => item.title);
      message(
        `以下数据无法提交：${invalidTitles.join("、")}。只能提交状态为"待提交"或"已驳回"的数据`,
        { type: "error", duration: 5000 }
      );
      return;
    }

    // 根据选中的ID获取对应的标题
    const selectedTitles = selectedItems.map(item => item.title);

    ElMessageBox.confirm(
      `是否确认提交标题为<strong style='color:var(--el-color-primary)'>[ ${selectedTitles.join("、")} ]</strong>的绩效上报项目材料?（无法撤回）`,
      "系统提示",
      {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
        dangerouslyUseHTMLString: true,
        draggable: true
      }
    )
      .then(async () => {
        await batchSubmitSubmissionApi(multipleSelection.value).then(() => {
          message(
            `您已成功提交标题为[ ${selectedTitles.join("、")} ]的绩效上报项目`,
            {
              type: "success"
            }
          );
          // 刷新列表
          getSubmissionList();
          // 清空checkbox选择的数据
          tableRef.getTableRef().clearSelection();
        });
      })
      .catch(() => {
        message("取消提交", {
          type: "info"
        });
        // 清空checkbox选择的数据
        tableRef.getTableRef().clearSelection();
      });
  }

  // 处理主分类变化
  function handleMainCategoryChange(value) {
    searchFormParams.subCategory = "";
    searchFormParams.itemCategory = "";
  }

  // 处理子分类变化
  function handleSubCategoryChange(value) {
    searchFormParams.itemCategory = "";
  }

  onMounted(getSubmissionList);

  return {
    searchFormParams,
    pageLoading,
    columns,
    dataList,
    pagination,
    defaultSort,
    timeRange,
    multipleSelection,
    mainCategoryOptions,
    subCategoryOptions,
    itemCategoryOptions,
    onSearch,
    onSortChanged,
    exportAllExcel,
    getSubmissionList,
    resetForm,
    handleDelete,
    handleSubmit,
    handleBulkDelete,
    handleBulkSubmit,
    handleMainCategoryChange,
    handleSubCategoryChange,
    categoryData,
    auditLevelMap,
    isSubProject
  };
}
